package scala.com.shujia.jichu

/**
 * def: 定义函数或者方法的关键字
 * main: 是函数或者方法的名字，符合标识符的命名规则
 * args: 函数形参的名字
 * Array[String]: 参数的数据类型是一个元素为字符串的数组
 * =: 后面跟着函数体
 * Unit: 等同于java中的void 表示无返回值的意思
 *
 *
 * def main(args: Array[String]): Unit = {
 *
 * }
 *
 * 在不同的地方定义，称呼不一样
 * 函数：在object中定义的叫做函数
 * 方法：在class中定义的叫做方法
 */
object Demo5Function {
  def main(args: Array[String]): Unit = {
    //调用函数
//    val res1: Int = add(3, 4)
//    println(res1)
//
//    // scala中的函数可以嵌套定义，函数中可以再定义函数
//    def plus(x: Int, y: Int): Int = {
//      return x + y
//    }
//
//    //调用必须在定义之后
//    val res2: Int = plus(10, 20)
//    println(res2)
//
////    val res3: Int = add2(11, 22)
////    println(res3)
//
//    val d1 = new Demo1()
//    val res4: Int = d1.add2(11, 22)
//    println(res4)
//
//    //object中的函数可以使用类名调用,类似于静态一样
//    val res5: Int = Demo5Function.add(100, 200)
//    println(res5)
//
//    //调用形式2：object中的函数调用时，可以省略类名
//    val res6: Int = add(200, 300)
//    println(res6)
//
////    val res7: Int = fun1("1000")
////    println(res7)
//
//    //如果方法调用的函数只有一个参数的时候，可以将.和小括号用空格代替调用
//    val res9: Int = Demo5Function.fun1("1000")
//    val res8: Int = Demo5Function fun1 "1000"   //  "=" * 50 -> "=".*(50)
//    println(res8)
//
    //如果定义的时候，没有小括号，调用的时候，就不需要加小括号
    show

  }

  //定义格式1：如果函数有返回值，且最后一句话作为返回值的话，return关键字可以不写
  def add3(a1: Int, b1: Int): Int = {
    a1 + b1
  }
  //定义格式2：如果函数体中只有一句实现，那么大括号也可以不写
  def add4(a1: Int, b1: Int): Int = a1 + b1

  //定义格式3：如果函数没有参数的时候,小括号省略不写
  def show= println("好好学习，天天向上！")



  //需求1：定义一个求两个数之和的函数，返回结果
  def add(a1: Int, b1: Int): Int = {
    return a1 + b1
  }

  def fun1(s:String): Int = {
    return s.toInt
  }


}

//函数或者方法必须定义在class或者object中
//def add2(a1: Int, b1: Int): Int = {
//  return a1 + b1
//}

class Demo1{
  //这里叫方法，将来调用时需要创建该类的对象才可以调用
  def add2(a1: Int, b1: Int): Int = {
    return a1 + b1
  }
}
